<?

require_once('view.class.php');

class controller_dispatcher{

	private static $instance;
	
	private $frontController;
	
	private $dirs;
	
	const CTRL_SUFFIX = 'Controller';
	const ACTION_SUFFIX = 'Action';
	const FILE_SUFFIX = '.php';
	
	
	private function __construct(controller_front $iFrontController){
		
		$this -> frontController = $iFrontController;
		$this -> dirs = $this -> frontController -> getControllerDir();
	
	}
	
	/*
		instantie ophalen...
	*/
	public static function getInstance(controller_front $iFrontController){
	
		if(self::$instance == NULL){
			self::$instance = new self($iFrontController);
		}
		
		
		
		return self::$instance;
	}


	/*
		hier wordt bepaalt welke file er geladen moet worden aan de hand van de controller en action
		dat is opgeslagen in het request object. Dit object is aangemaakt in de front_controller (waar een
		instantie van wordt meegegeven) en opgevuld in de router.
	*/ 
	public function dispatch(){
	
		
		
		// het request object ophalen
		$request = $this -> frontController -> getRequest();
		
	
		// controllernaam
		$controllerName = $request -> getController() . self::CTRL_SUFFIX;
		// actie
		$actionName = $request -> getAction() . self::ACTION_SUFFIX;
		
		
		// de file waarin de controller staat samenstellen
		$controllerFile = $controllerName . self::FILE_SUFFIX;
		
		
		// er is geen module ingesteld
		if($request -> getModule() != NULL){
		
			
					
					$pathToController = $this -> dirs[$request->getModule()];
					
				
			
			
		
		}else{
		
			$pathToController = $this -> frontController -> getControllerDir();
		
		}
		
		require_once($pathToController.$controllerFile);
		
		$controller = new $controllerName($request, new view(), $this -> frontController -> getDbobj());
		
		$controller -> $actionName();
		
		
		
	}
	
	
	// kijken of de controller geldig is
	
	public function checkController(controller_request $iRequest){
		$ctrl = $iRequest -> getController() . self::CTRL_SUFFIX;
		$file =  $this -> dirs[$iRequest -> getModule()] . $ctrl . self::FILE_SUFFIX;
		
		
		
		if(is_file($file)){
			
			require_once($file);
			
			if(class_exists($ctrl)){
			
				return true;		
			
			}else{
				
				return false;
			
			}
		
		}else{
		
			return false;
		
		}
	
	}
	
	// kijken of de actie bestaat en kan aangeroepen worden
	
	public function checkAction(controller_request $iRequest){
	
		$ctrl = $iRequest -> getController() . self::CTRL_SUFFIX;
		$file =  $this -> dirs[$iRequest -> getModule()] . $ctrl . self::FILE_SUFFIX;
		$action = $iRequest -> getAction() . self::ACTION_SUFFIX;
		
		require_once($file);
		
		if(method_exists($ctrl, $action)){
			return true;
			
		}else{
		
			return false;
		}
		
	}
	
}

?>